package com.medic.mapper.interf;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.medic.entity.group.pain.Compliance;
import com.medic.entity.group.pain.Health;
import com.medic.entity.group.pain.Pain;
import com.medic.entity.group.pain.PainNature;
import com.medic.entity.group.pain.Reaction;
import com.medic.entity.group.pain.TakeRecord;
import com.medic.entity.group.pain.Task;
import com.medic.entity.group.pain.TitrRecord;

/**
 * 任务Mapper
 * 
 * @author Mr.zhang
 *
 */
public interface TaskMapper extends MapperInterface<Task> {

	/**
	 * 批量添加
	 * 
	 * @param tasks
	 *            任务list集合
	 * @return 成功条数
	 * @throws Exception
	 */
	public int saveBatch(List<Task> tasks) throws Exception;

	/**
	 * 患者完成任务
	 * 
	 * @param tsId
	 *            任务id
	 * @param sikerId
	 *            患者id
	 * @return 修改成功条数
	 * @throws Exception
	 */
	public int finish(@Param("tsId") long tsId, @Param("sikerId") int sikerId, @Param("finishDate") long finishDate)
			throws Exception;

	/**
	 * 判断该任务是否属于该用户
	 * 
	 * @param tsId
	 *            任务id
	 * @param sikerId
	 *            患者id
	 * @return 返回组的id(在进行入组信息查找的时候需要)
	 * @throws Exception
	 */
	public int judge(@Param("tsId") long tsId, @Param("sikerId") int sikerId) throws Exception;

	/**
	 * 医生、药师、助手批阅
	 * 
	 * @param status
	 *            医生、药师、助手各自对应的code
	 * @param tsId
	 *            任务id
	 * @return 修改成功条数
	 * @throws Exception
	 */
	public int checkup(@Param("status") int status, @Param("tsId") long tsId) throws Exception;

	/**
	 * 更新滴定过程中的过期时间
	 * 
	 * @param crDate
	 *            过期时间
	 * @param tsId
	 *            任务id
	 * @return 更行成功条数
	 * @throws Exception
	 */
	public int updateTitrCrDate(@Param("crDate") long crDate, @Param("tsId") long tsId) throws Exception;

	/**
	 * 患者分页查询（不需要患者姓名）
	 * 
	 * @param sikerId
	 *            患者id
	 * @param groupId
	 *            组id
	 * @param status
	 *            状态 2已完成 1未完成过期 0未完成未过期（在数据库中未完成的都是1，而过期与否用crDate来进行判断）
	 * @param crDate
	 *            当前时间毫秒数，如果是已经完成任务，传值0即可，查询未完成的任务，判断过期需要用到，所以必须。
	 * @return list集合
	 * @throws Exception
	 */
	public List<Task> selectByPageUser(@Param("sikerId") int sikerId, @Param("groupId") int groupId,
			@Param("status") int status, @Param("crDate") long crDate) throws Exception;

	/**
	 * 医生分页查询（需要用户名字）
	 * 
	 * @param groupId
	 *            组id
	 * @param status
	 *            状态 3 已批阅 2未批阅 1未完成过期 0未完成未过期（在数据库中未完成的都是1，而过期与否用crDate来进行判断）
	 * @param crDate
	 *            当前时间毫秒数，如果是已经完成任务，传值0即可，查询未完成的任务，判断过期需要用到，所以必须。
	 * @return list集合
	 * @throws Exception
	 */
	public List<Task> selectByPageDoctor(@Param("groupId") int groupId, @Param("status") int status,
			@Param("crDate") long crDate) throws Exception;

	/**
	 * 助手分页查询（需要用户名字）
	 * 
	 * @param groupId
	 *            组id
	 * @param status
	 *            状态 3 已批阅 2未批阅 1未完成过期 0未完成未过期（在数据库中未完成的都是1，而过期与否用crDate来进行判断）
	 * @param crDate
	 *            当前时间毫秒数，如果是已经完成任务，传值0即可，查询未完成的任务，判断过期需要用到，所以必须。
	 * @return list集合
	 * @throws Exception
	 */
	public List<Task> selectByPageAssitant(@Param("groupId") int groupId, @Param("status") int status,
			@Param("crDate") long crDate) throws Exception;

	/**
	 * 药师分页查询（需要用户名字）
	 * 
	 * @param groupId
	 *            组id
	 * @param status
	 *            状态 3 已批阅 2未批阅 1未完成过期 0未完成未过期（在数据库中未完成的都是1，而过期与否用crDate来进行判断）
	 * @param crDate
	 *            当前时间毫秒数，如果是已经完成任务，传值0即可，查询未完成的任务，判断过期需要用到，所以必须。
	 * @return list集合
	 * @throws Exception
	 */
	public List<Task> selectByPagePharmacist(@Param("groupId") int groupId, @Param("status") int status,
			@Param("crDate") long crDate) throws Exception;

	/**
	 * 根据id查找
	 * 
	 * @param tsId
	 *            任务id
	 * @return 任务对象
	 * @throws Exception
	 */
	public Task selectById(long tsId) throws Exception;

	/**
	 * 添加依从性反馈
	 * 
	 * @param compliance
	 *            依从性
	 * @return 成功条数
	 * @throws Exception
	 */
	public int saveCompliance(Compliance compliance) throws Exception;

	/**
	 * 通过任务id查找依从性反馈
	 * 
	 * @param id
	 *            任务id
	 * @return 对象
	 * @throws Exception
	 */
	public Compliance selectComplianceByTsId(long id) throws Exception;

	/**
	 * 添加健康反馈
	 * 
	 * @param hls
	 *            健康反馈问题大难键值对列表
	 * @return 成功条数
	 * @throws Exception
	 */
	public int saveHealth(List<Health> hls) throws Exception;

	/**
	 * 根据任务id查找
	 * 
	 * @param id
	 *            任务id
	 * @return list集合
	 * @throws Exception
	 */
	public List<Health> selectHealthByTsId(long id) throws Exception;

	/**
	 * 添加疼痛反馈
	 * 
	 * @param pain
	 *            对象
	 * @return 成功条数
	 * @throws Exception
	 */
	public int savePain(Pain pain) throws Exception;

	/**
	 * 添加疼痛反馈中的疼痛性质
	 * 
	 * @param pn
	 *            疼痛性质
	 * @return 成功条数
	 * @throws Exception
	 */
	public int savePainNature(PainNature pn) throws Exception;

	/**
	 * 通过任务id或者painId查询，用于详细信息展示（利用tsId时，疼痛反馈不能是滴定任务中的）
	 * 
	 * @param tsId
	 *            任务id
	 * @param painId
	 *            疼痛反馈id
	 * @return 疼痛反馈对象
	 * @throws Exception
	 */
	public Pain selectPainByTsIdOrId(@Param("tsId") long tsId, @Param("painId") int painId) throws Exception;

	/**
	 * 添加不良反应反馈
	 * 
	 * @param reaction
	 *            不良反应反馈对象
	 * @return 成功条数
	 * @throws Exception
	 */
	public int saveReaction(Reaction reaction) throws Exception;

	/**
	 * 通过任务id查找
	 * 
	 * @param tsId
	 *            任务id
	 * @return 对象
	 * @throws Exception
	 */
	public Reaction selectReactionByTsId(long tsId) throws Exception;

	/**
	 * 添加滴定记录
	 * 
	 * @param titr
	 *            滴定过程记录
	 * @return 成功条数
	 * @throws Exception
	 */
	public int saveTitrRecord(TitrRecord titr) throws Exception;

	/**
	 * 通过任务id查找滴定记录列表
	 * 
	 * @param tsId
	 *            任务id
	 * @return list集合
	 * @throws Exception
	 */
	public List<TitrRecord> selectTitrRecordByTsId(long tsId) throws Exception;

	/**
	 * 确认滴定过程中的服药
	 * 
	 * @param titrId
	 *            滴定记录id
	 * @return 成功条数
	 * @throws Exception
	 */
	public int sureTake(long titrId) throws Exception;

	/**
	 * 在疼痛评估完成后，更新滴定记录中的疼痛评估相关信息
	 * 
	 * @param titrId
	 *            滴定记录id
	 * @param painId
	 *            疼痛评估id
	 * @param crDate
	 *            评估完成时间
	 * @param painLevel
	 *            疼痛等级
	 * @return 成功条数
	 * @throws Exception
	 */
	public int updateTitrRecord(@Param("titrId") long titrId, @Param("painId") int painId, @Param("crDate") long crDate,
			@Param("painLevel") int painLevel) throws Exception;

	/**
	 * 添加服药提醒的服药记录
	 * 
	 * @param takeRecord
	 *            服药记录
	 * @return 成功条数
	 * @throws Exception
	 */
	public int saveTakeRecord(TakeRecord takeRecord) throws Exception;

	/**
	 * 根据任务id查找服药记录
	 * 
	 * @param tsId
	 *            任务id
	 * @return 服药记录
	 * @throws Exception
	 */
	public TakeRecord selectTakeRecordByTsId(long tsId) throws Exception;

	/**
	 * 查询出所有未完成的任务未过期
	 * 
	 * @param nowDate
	 *            当前时间
	 * @return list集合
	 * @throws Exception
	 */
	public List<Task> selectUndo(long nowDate) throws Exception;

	/**
	 * 查询出最新的一条滴定任务的id
	 * 
	 * @param sikerId
	 *            患者id
	 * @return 任务的id
	 * @throws Exception
	 */
	public long selectTitrTask(int sikerId) throws Exception;

	/**
	 * 获取患者在组里某种任务的总数目
	 * 
	 * @param sikerId
	 *            患者id
	 * @param groupId
	 *            组id
	 * @param tsType
	 *            任务类型（如果是0则是所有任务）
	 * @return 总数目
	 * @throws Exception
	 */
	public int selectTaskNum(@Param("sikerId") int sikerId, @Param("groupId") int groupId, @Param("tsType") int tsType)
			throws Exception;
}
